
題目解析:在一棵二元搜尋樹 (BST) 中,找出節點數值等於目標值的節點,並回傳以該節點為根的整棵子樹。如果找不到就回傳 null
解題思路:利用二元搜尋樹「左小右大」的特性來找。丟進迴圈跑,只要目前節點不是空的,且數值還沒對上目標值就繼續找。如果目標值比目前節點的值還要小,就往左邊的子樹找;反之如果比較大,就往右邊的子樹找。迴圈結束時,代表要嘛找到了,要嘛走到盡頭變成空值,直接回傳目前的節點即可
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while (root && root->val != val) {
if (val < root->val)
root = root->left;
else
root = root->right;
}
return root;
}
};

題目解析:實作一個無限大集合的類別,裡面預設包含所有正整數 (1, 2, 3...)。需要支援兩個功能:一個是移除並回傳集合中最小的數字,另一個是把數字加回集合中(如果該數字原本不在裡面的話)。
解題思路:不需要真的建一個無限大的陣列。設一個變數 cur 記錄目前無限序列發派到哪個數字(初始為 1),再設一個集合 v 用來裝「被加回來的數字」。
popSmallest: 因為被加回來的數字一定比 cur 小,所以先檢查集合 v 是不是空的。如果有東西,就把集合裡最小的(也就是第一個)數字拔出來回傳;如果集合是空的,就直接回傳 cur,並把 cur 加 1 推進到下一個數字。
addBack: 傳入的數字必須小於 cur 才有意義(因為大於等於 cur 的數字本來就還在無限序列裡,還沒被拿走)。如果小於 cur,就把它塞進集合 v 裡面,集合的特性會自動幫我們過濾掉重複加入的情況。
class SmallestInfiniteSet {
private:
int cur;
set<int> v;
public:
SmallestInfiniteSet() {
cur = 1;
}
int popSmallest() {
if (!v.empty()) {
int x = *v.begin();
v.erase(v.begin());
return x;
}
return cur++;
}
void addBack(int num) {
if (num < cur) {
v.insert(num);
}
}
};